package ThreadDemo;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 34255
 * Date: 2024-10-10
 * Time: 18:26
 */
class Test{
    public boolean flag = false;
}
public class Demo9 {
    //终止线程：让线程的入口方法执行结束，线程随即关闭
//    public static boolean isFinished = false;
    public static void main(String[] args) {
        boolean isFinished = false;
        Test test = new Test();
        Thread t = new Thread(() -> {
            while(!test.flag){//!isFinished
                //触发了lambda的遍历捕获机制，当lambda表达式里使用了外部作用域的局部变量时，就会捕获该变量并拷贝一份
                //实际上就生成了两份同名的变量，这样即使一个变量修改，但是另外的变量也不会修改，就可能使造成错误，
                //所以java就规定这被捕获的变量要么被final修饰，或初始化后就不能修改，否则编译报错
                test.flag = true;//不报错
//                test = new Test();这里报错是因为test是局部变量，受main线程是否结束的影响，但是上面不报错是因为对象不受main线程影响，因为main
                //对象存储在堆区，受到JVM的垃圾回收线程影响，不会随着main线程结束而销毁
                System.out.println("hello thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"线程1");

        t.start();

        for (int i = 0; i < 3; i++) {
            System.out.println("hello main");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }


}
